package com.atguigu.eduorder.controller;


import com.atguigu.commonutils.JwtUtils;
import com.atguigu.commonutils.R;
import com.atguigu.eduorder.entity.Order;
import com.atguigu.eduorder.service.OrderService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.http.impl.bootstrap.HttpServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * <p>
 * 订单 前端控制器
 * </p>
 *
 * @author ITCast
 * @since 2022-04-21
 */
@RestController
@RequestMapping("/eduorder/order")
// @CrossOrigin
public class OrderController {
    @Autowired
    private OrderService orderService;

    // 1 生成订单的方法
    @PostMapping("createOrder/{courseId}")
    public R saveOrder(@PathVariable String courseId, HttpServletRequest request){
        // 问题：如何获取课程的Id和用户的Id
        // 课程的Id是在我们点击购买的页面路径中就有的 因此可以令前端直接作为参数发送过来
        // 而用户的Id则是在用户登陆后，将会保存在浏览器的Cookie中，发送时则需要放在request中
        System.out.println("收到订单请求——courseId:"+courseId);
        String MemberId = JwtUtils.getMemberIdByJwtToken(request);
        System.out.println("用户查询——MemberId:"+MemberId);
        if ("".equals(MemberId)){
            return R.error();
        }
        // 在service层书写对应方法
        // 我们的需求是 生成一个订单 并将订单号返回到前台
        String orderNum = orderService.createOrders(courseId, MemberId);
        System.out.println("生成订单——orderNum:"+orderNum);
        return R.ok().data("orderId", orderNum);

    }

    // 2 页面拿到订单号后会跳转到支付页面 这个时候就需要显示我们订单中所具有的信息
    // 因此需要构建一个方法根据订单号查询相应信息
    @GetMapping("getOrderInfo/{orderId}")
    public R getOrderInfo(@PathVariable String orderId) {
        // 根据订单号查询订单信息
        QueryWrapper<Order> wrapper = new QueryWrapper<>();
        wrapper.eq("order_no",orderId);
        // 当某一个属性对应的数据库记录是唯一的 那么就可以直接使用mp提供的getOne方法
        // 只需要传入wrapper即可查询出唯一的记录
        // 这里需要注意的是 之前我们都是用getById的方法获取唯一记录
        // 但是此时order表中的主键id并不是我们所生成的订单号
        // getById是必须使用主键来进行查询的
        // 因此当我们需要查询某条具有唯一值但并非主键的记录时，应当使用getOne
        Order order = orderService.getOne(wrapper);
        return R.ok().data("item",order);
    }

    // 根据课程Id以及用户Id查询订单表中订单的状态
    @GetMapping("isBuyCourse/{courseId}/{memberId}")
    public boolean isBuyCourse(@PathVariable String courseId,@PathVariable String memberId) {
        QueryWrapper<Order> wrapper = new QueryWrapper<>();
        wrapper.eq("course_id",courseId);
        wrapper.eq("member_id",memberId);
        // 查状态是否为1
        wrapper.eq("status",1);
        // 我们直接使用service中的count方法 该方法能够查询出符合我们设定条件的数据的数量

//        if (orderService.count(wrapper) > 0){
//            return true;
//        }
        // 如果能查到大于0的数据 代表已经支付过了
        return orderService.count(wrapper) > 0;
    }
}

